//package com.spi.demo;
//
//import cn.hutool.core.lang.JarClassLoader;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.logging.log4j.util.Strings;
//import org.springframework.beans.factory.config.BeanDefinition;
//import org.springframework.beans.factory.support.BeanDefinitionBuilder;
//import org.springframework.beans.factory.support.BeanDefinitionRegistry;
//import org.springframework.context.EnvironmentAware;
//import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
//import org.springframework.core.env.Environment;
//import org.springframework.core.type.AnnotationMetadata;
//import org.springframework.stereotype.Component;
//import org.springframework.stereotype.Repository;
//import org.springframework.stereotype.Service;
//
//import java.io.File;
//import java.lang.reflect.Modifier;
//import java.net.URI;
//import java.net.URL;
//import java.util.Arrays;
//import java.util.Enumeration;
//import java.util.LinkedList;
//import java.util.List;
//import java.util.jar.JarEntry;
//import java.util.jar.JarFile;
//import java.util.regex.Pattern;
//
//
//@Slf4j
//public class PluginImportBeanDefinitionRegistrar2 implements ImportBeanDefinitionRegistrar, EnvironmentAware {
//
//
//    //匹配数字的正则
//    private static Pattern pattern = Pattern.compile("[0-9]");
//
//    /**
//     * jar包存放路径
//     */
//    private String libPath;
//
//    /**
//     * 动态加载jar包名称，多个用英文逗号隔开
//     */
//    private String loadJarNames;
//
//    @Override
//    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
//        //获取要动态加载的jar列表
//        List<String> jarList = new LinkedList<>();
//        if (Strings.isNotBlank(loadJarNames)) {
//            jarList.addAll(Arrays.asList(loadJarNames.split(",")));
//        }
//        //开始加载jar包
//        try {
//            if (jarList.size() > 0) {
//                //循环按顺序加载
//                for (String jarName : jarList) {
//                    log.info("开始热加载jar包 ---------------> {}", jarName);
//                    File jar = new File(libPath + "/" + jarName);
//                    if(!jar.exists()){
//                        log.info("jar包不存在");
//                    }
//                    JarFile jarFile = new JarFile(jar);
//                    URI uri = jar.toURI();
//                    URL url = uri.toURL();
//
//                    JarClassLoader jarClassLoader = JarClassLoader.loadJar(jar);
////                        //获取classloader
////                        URLClassLoader classLoader = (URLClassLoader) Thread.currentThread().getContextClassLoader();
////                        //利用反射获取方法
////                        Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
////                        if (!method.isAccessible()) {
////                            method.setAccessible(true);
////                        }
////                        method.invoke(classLoader, url);
//                    for (Enumeration<JarEntry> ea = jarFile.entries(); ea.hasMoreElements(); ) {
//                        JarEntry jarEntry = ea.nextElement();
//                        String name = jarEntry.getName();
//                        if (name != null && name.endsWith(".class")) {
//                            String loadName = name.replace("/", ".").substring(0, name.length() - 6);
//                            //加载class
//                            Class<?> c = jarClassLoader.loadClass(loadName);
//                            //注册bean
//                            insertBean(c, registry);
//                        }
//                    }
//                    log.info("结束热加载jar包 ---------------> {}", jarName);
//                    jar.delete();
//                }
//            }
//        } catch (Exception e) {
//            log.error("热加载jar包异常");
//            e.printStackTrace();
//        }
//    }
//
//
//    private void insertBean(Class<?> c, BeanDefinitionRegistry registry) {
//        if (isSpringBeanClass(c)) {
//            BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(c);
//            BeanDefinition beanDefinition = builder.getBeanDefinition();
//            registry.registerBeanDefinition(c.getName(), beanDefinition);
//        }
//    }
//
//    /**
//     * 方法描述 判断class对象是否带有spring的注解
//     *
//     * @param cla jar中的每一个class
//     * @return true 是spring bean   false 不是spring bean
//     * @method isSpringBeanClass
//     */
//    public boolean isSpringBeanClass(Class<?> cla) {
//        if (cla == null) {
//            return false;
//        }
//        //是否是接口
//        if (cla.isInterface()) {
//            return false;
//        }
//        //是否是抽象类
//        if (Modifier.isAbstract(cla.getModifiers())) {
//            return false;
//        }
//        if (cla.getAnnotation(Component.class) != null) {
//            return true;
//        }
//        if (cla.getAnnotation(Repository.class) != null) {
//            return true;
//        }
//        if (cla.getAnnotation(Service.class) != null) {
//            return true;
//        }
//        return false;
//    }
//
//    @Override
//    public void setEnvironment(Environment environment) {
//        this.libPath = environment.getProperty("libPath");
//        this.loadJarNames = environment.getProperty("loadJarNames");
//    }
//}